package demo08

/**
 * @author xiaoZhao
 * @date 2022/8/8
 * @describe 隐式转换
 */
object Test02_Implicit {
  def main(args: Array[String]): Unit = {
    // 1.隐式函数
    implicit def convert(num: Int):MyRichInt = new MyRichInt(num)

    println(12.myMax(16))

    // 2.隐式类
    implicit class MyRichInt2(val self: Int) {
      // 自定义比较大小的方法
      def myMax2(n: Int): Int = if (n < self) self else n

      def myMain2(n: Int): Int = if (n < self) n else  self
    }

    println(12.myMax2(16))

    // 隐式参数
    // 传递隐式参数值的时候，上下文作用域范围内，找的不是相同的参数名而是参数类型
    // 同一作用域范围内，隐式参数只能有一个
    // 隐式值会覆盖掉默认值的定义

    implicit val str: String = "alice"
    implicit  val num: Int = 12

    def sayHello(implicit name: String) :Unit={
      println(" hello, " + name)
    }
    sayHello

    // 简便写法
    def hiAge(): Unit={
      println("hi, " + implicitly[Int])
    }
    hiAge()

  }
}

// 自定义类
class MyRichInt(val self: Int) {
  // 自定义比较大小的方法
  def myMax(n: Int): Int = if (n < self) self else n

  def myMain(n: Int): Int = if (n < self) n else  self
}